# ---- Stage 1: Builder ----
# 使用一个带有构建工具的 Python Alpine 基础镜像
FROM python:3.10-alpine AS builder

# 设置工作目录
WORKDIR /usr/src/app

# 安装构建依赖项，这些依赖项在最终镜像中是不需要的
# libffi-dev 用于 PyJWT 的依赖 cryptography
RUN apk add --no-cache build-base libffi-dev

# 复制依赖文件并安装
COPY requirements.txt .
RUN pip wheel --no-cache-dir --wheel-dir /usr/src/app/wheels -r requirements.txt

# ---- Stage 2: Final Image ----
# 使用一个干净的 Python Alpine 基础镜像，保持最终镜像小巧
FROM python:3.10-alpine

# 创建一个非 root 用户来运行应用，增强安全性
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

# 设置工作目录
WORKDIR /home/appuser

# 从 builder 阶段复制已编译的 wheels
COPY --from=builder /usr/src/app/wheels /wheels
COPY --from=builder /usr/src/app/requirements.txt .

# 使用 wheels 安装依赖，速度更快且无需编译
RUN pip install --no-cache-dir --no-index --find-links=/wheels -r requirements.txt

# 复制应用代码，并设置正确的权限
COPY --chown=appuser:appgroup authapp.py .

# 切换到非 root 用户
USER appuser

# 暴露容器的 8383 端口
EXPOSE 8383

# 设置容器启动时执行的命令，使用 Gunicorn 启动 Flask 应用
# -w 4: 启动4个 worker 进程处理请求
# --bind 0.0.0.0:8383: 监听容器内的8383端口
# app:app: 第一个app是文件名(app.py), 第二个app是Flask实例名(app = Flask(...))
CMD ["gunicorn", "-w", "4", "--bind", "0.0.0.0:8383", "authapp:app"]

